From 3023d254ddfc1e2d11038a098366782b15d909af Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Fri, 24 Nov 2017 06:07:09 +0100 Subject: [PATCH] clipboard: Make value getters set the passed in value Don't return a const GValue, that's ugly API. Instead require people to pass in a preinitialized GValue and set that one. --- gdk/gdkclipboard.c | 23 +++++++++++++++++------ gdk/gdkcontentdeserializer.c | 14 ++++++++------ gdk/gdkcontentdeserializer.h | 3 ++- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/gdk/gdkclipboard.c b/gdk/gdkclipboard.c index 2b37270315..bd213625ff 100644 --- a/gdk/gdkclipboard.c +++ b/gdk/gdkclipboard.c @@ -347,13 +347,14 @@ gdk_clipboard_read_value_done (GObject *source, { GTask *task = data; GError *error = NULL; - const GValue *value; + GValue *value; + + value = g_task_get_task_data (task); - value = gdk_content_deserialize_finish (result, &error); - if (value == NULL) + if (!gdk_content_deserialize_finish (result, value, &error)) g_task_return_error (task, error); else - g_task_return_pointer (task, (gpointer) value, NULL); + g_task_return_pointer (task, value, NULL); g_object_unref (task); } @@ -377,7 +378,7 @@ gdk_clipboard_read_value_got_stream (GObject *source, gdk_content_deserialize_async (stream, mime_type, - GPOINTER_TO_SIZE (g_task_get_task_data (task)), + G_VALUE_TYPE (g_task_get_task_data (task)), g_task_get_priority (task), g_task_get_cancellable (task), gdk_clipboard_read_value_done, @@ -385,6 +386,13 @@ gdk_clipboard_read_value_got_stream (GObject *source, g_object_unref (stream); } +static void +free_value (gpointer value) +{ + g_value_unset (value); + g_slice_free (GValue, value); +} + static void gdk_clipboard_read_value_internal (GdkClipboard *clipboard, GType type, @@ -396,6 +404,7 @@ gdk_clipboard_read_value_internal (GdkClipboard *clipboard, { GdkContentFormatsBuilder *builder; GdkContentFormats *formats; + GValue *value; GTask *task; builder = gdk_content_formats_builder_new (); @@ -406,7 +415,9 @@ gdk_clipboard_read_value_internal (GdkClipboard *clipboard, task = g_task_new (clipboard, cancellable, callback, user_data); g_task_set_priority (task, io_priority); g_task_set_source_tag (task, source_tag); - g_task_set_task_data (task, GSIZE_TO_POINTER (type), NULL); + value = g_slice_new0 (GValue); + g_value_init (value, type); + g_task_set_task_data (task, value, free_value); gdk_clipboard_read_internal (clipboard, formats, diff --git a/gdk/gdkcontentdeserializer.c b/gdk/gdkcontentdeserializer.c index bcfc11e7e1..6c931e0978 100644 --- a/gdk/gdkcontentdeserializer.c +++ b/gdk/gdkcontentdeserializer.c @@ -380,25 +380,27 @@ gdk_content_deserialize_async (GInputStream *stream, user_data); } -const GValue * +gboolean gdk_content_deserialize_finish (GAsyncResult *result, + GValue *value, GError **error) { GdkContentDeserializer *deserializer; - g_return_val_if_fail (GDK_IS_CONTENT_DESERIALIZER (result), NULL); - g_return_val_if_fail (error == NULL || *error == NULL, NULL); - + g_return_val_if_fail (GDK_IS_CONTENT_DESERIALIZER (result), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); deserializer = GDK_CONTENT_DESERIALIZER (result); + g_return_val_if_fail (G_VALUE_HOLDS (value, G_VALUE_TYPE (&deserializer->value)), FALSE); if (deserializer->error) { if (error) *error = g_error_copy (deserializer->error); - return NULL; + return FALSE; } - return &deserializer->value; + g_value_copy (&deserializer->value, value); + return TRUE; } /*** DESERIALIZERS ***/ diff --git a/gdk/gdkcontentdeserializer.h b/gdk/gdkcontentdeserializer.h index 481f15a838..102a4bcc4e 100644 --- a/gdk/gdkcontentdeserializer.h +++ b/gdk/gdkcontentdeserializer.h @@ -81,7 +81,8 @@ void gdk_content_deserialize_async (GInputS GAsyncReadyCallback callback, gpointer user_data); GDK_AVAILABLE_IN_3_94 -const GValue * gdk_content_deserialize_finish (GAsyncResult *result, +gboolean gdk_content_deserialize_finish (GAsyncResult *result, + GValue *value, GError **error); -- 2.30.2